package com.zhihuishu.micro.course.service;

import java.util.List;
import java.util.Map;
import java.util.Set;

import redis.clients.jedis.Jedis;

import com.zhihuishu.micro.course.dto.CourseBaseInfoDto;
import com.zhihuishu.micro.course.dto.CourseDto;
import com.zhihuishu.micro.course.dto.ScoreAssessRuleDto;
import com.zhihuishu.micro.course.model.CourseStatus;
import com.zhihuishu.micro.course.model.TblCourse;

/**
 * 课程服务接口
 * 
 * @author zhanglikun
 * @date 2015年9月21日 上午10:16:03
 */
public interface CourseService {

    /**
     * 创建课程仅需要提供课程名称、创建人UID即可(业务灵活性)
     * 
     * @param courseName
     * @param createUser
     * @return 返回创建的课程ID
     */
    CourseDto create(String courseName, long createUser);

    /**
     * 创建Myuni课程，并返回创建的学堂课程ID
     * 
     * @param myuniCourseId
     * @param courseName
     * @param createUser
     * @param courseType
     * @return
     */
    CourseDto create(Long myuniCourseId, String courseName, long createUser, Integer courseType);

    void update(CourseDto course, long updateUser);

    CourseDto get(long courseId);

    /**
     * 更新课程缓存
     * 
     * @param courseId
     * @return 返回数据库中查询出的课程对象
     */
    CourseDto touchCourse(long courseId);

    /**
     * 更新课程视频数(节或小节对应视频数)
     * 
     * @param courseId
     * @param limit
     * @return 当前视频总数
     */
    long updateCourseVideoTotalRedis(long courseId);

    /**
     * 查询课程单个字段信息
     * 
     * @param courseId
     * @param field
     * @return
     */
    String getByField(long courseId, String field);

    /**
     * 根据课程ID获取CC_COURSE_ID
     * 
     * @param courseId
     * @return
     */
    Long getLinkCourseId(long courseId);

    /**
     * 根据课程ID查询Myuni课程ID
     * 
     * @param courseId
     * @return
     */
    Long getMyuniCourseId(long courseId);

    /**
     * 根据CC_COURSE_ID获取课程ID
     * 
     * @param linkCourseId
     * @return
     */
    Long getByLinkId(long linkCourseId);

    void remove(long courseId, long deleteUser);

    String getCourseName(long courseId);

    String getCourseBackground(long courseId);

    String getCourseTarget(long courseId);

    String getCourseIntroduction(long courseId);

    String getCourseImage(long courseId);

    /**
     * 查询课程运行模式
     * 
     * @param courseId
     * @return
     */
    Integer getCourseMode(long courseId);

    /**
     * 根据课程ID获取：课程计划中所有的学习时间 + 课程计划中的复习时间 考试的计划时间（见建课第二步）
     * 
     * @param onlineCourseId
     * @return
     */
    Map<String, String> getStudyDays(long onlineCourseId);

    /**
     * 查询考核标准（在线成绩满分、见面课成绩满分、期末考试成绩满分、论坛成绩满分）
     * 
     * @param onlineCourseId
     * @return
     */
    ScoreAssessRuleDto queryScoreAssessRule(long onlineCourseId);

    /**
     * 更新课程状态（state:null建设中。0:待审核，1：通过审核，2：不通过）
     * 
     * @param onlineCourseId
     * @param state
     * @param userId
     */
    void updateCourseState(long courseId, Integer state, long userId);

    /**
     * 
     * @author yulijin
     * @date 2016年8月12日 上午9:02:27
     * @param courseIds
     * @return Long:courseId
     */
    List<TblCourse> findCourseByCourseIds(List<Long> courseIds);

    List<CourseStatus> findCoursesStatus(List<Long> courseIds);

    /**
     * 根据课程id查询根课程下面所有的课程ids
     * 
     * @author yulijin
     * @date 2016年9月6日 上午8:45:52
     * @param courseIds
     * @return
     */
    List<Long> findCourseIdFamilysByCourseId(Long courseId);

    /**
     * 根据课程Id查询复制根课程id
     * 
     * @author yulijin
     * @date 2016年9月7日 上午9:34:24
     * @param courseId
     * @return
     */
    Long findRootCourseIdByCourseId(Long courseId);

    /**
     * 
     * @discription 创建海外课程
     * @author jipeng
     * @created 2016年9月9日 下午3:14:14
     * @param myuniId
     * @param courseName
     * @param createUser
     * @return
     */
    CourseDto createOverSeasCourse(String courseName, long createUser);

    /**
     * 根据用户ID查询用户创建的课程列表
     * 
     * @param userId
     * @param type 课程类型
     * @return
     */
    List<CourseDto> userCourseList(long userId, Integer type);

    /**
     * 根据课程id查询视频数量（进阶）
     * 
     * @discription
     * @author jipeng
     * @created 2016年9月19日 下午3:39:07
     * @param courseId
     * @return
     */
    int queryVideoCount(long courseId);
    
    /**
     * 根据课程id查询视频数量（微课）
     * @author ztl
     * @date 2016年11月15日下午5:00:50
     * @param courseId
     * @return
     */
    int queryVideoCountForMincourse(long courseId);
    
    /**
     * 查询课程是新版建课还是老版建课 返回结果：等于0 为老版建课，否则为新版
     * 
     * @author ztl
     * @param courseId
     * @return
     */
    int findCourseStepStatCount(Long courseId);

    /**
     * 根据课程ID集合获取课程名、课程设计原则、课程设计原则更新时间、课程推广推荐词、课程推广片花ID、课程推广更新时间
     * 
     * @author ztl
     * @param courseIds
     * @return
     */
    List<TblCourse> getCourseIntroductionAndMovieClipsInfo(List<Long> courseIds);

    /**
     * 
     * @discription 根据课程id与属性 查询对应的属性信息
     * @author jipeng
     * @created 2016年9月29日 上午11:14:24
     * @param courseId
     * @param propList
     * @return
     */
    Map<String, String> queryCourseExtentPropByPropNameList(long courseId, List<String> propList);

    /**
     * 
     * @discription 根据课程id删除课程的redis缓存
     * @author jipeng
     * @created 2016年10月27日 上午9:47:52
     * @param courseId
     */
    void removeCourseChecheByCourseId(Long courseId);

    /**
     * 根据条件查询课程数量
     * 
     * @param name
     * @param courseTypeCode
     * @param code
     * @return
     */
    int queryCourseCount(Integer schoolId, String name, Integer courseType, Integer courseStatus);

    /**
     * 根据条件查询课程数量
     * 
     * @param schoolId
     * @param name
     * @param courseTypeCode
     * @param integer
     * @param code
     * @return
     */
    int queryCourseCount(String name, Integer courseTypeCode, Integer schoolId);

    /**
     * 
     * @Title:
     * @Description: 查询课程集合
     * @param @param courseIdList
     * @param @return
     * @return List<CourseDto>
     * @author jipeng
     * @throws
     */
    List<CourseDto> findCourseDtoByList(List<Long> courseIdList);

    /**
     * @param limit 
     * @param offect 
     * @param pageBean 
     * 根据 条件查询课程id集合
     * 
     * @Title:
     * @Description: TODO
     * @param @param schoolId
     * @param @param name
     * @param @param courseType
     * @param @param code
     * @param @return
     * @return int
     * @author jipeng
     * @throws
     */
    List<Long> queryCourseIds(Integer schoolId, String name, Integer courseType, Integer code, int offect, int limit);

    /**
     * 根据 条件查询课程id集合
     * 
     * @Title:
     * @Description: TODO
     * @param @param name
     * @param @param courseType
     * @param @param schoolId
     * @param @return
     * @return List<Integer>
     * @author jipeng
     * @throws
     */
    List<Long> queryCourseIds(String name, Integer courseType, Integer schoolId,int offect, int limit);
    
    /**
     * 查询课程的信息
    * @Title:
    * @Description: TODO
    * @param @param courseIds
    * @param @return    
    * @return List<CourseDto> 
    * @author jipeng
    * @throws
     */
    List<CourseDto> queryCourseInfo(List<Long> courseIds);
    /**
     * @Description:更新课程背景
     *  @date:@2016年12月14日下午3:06:11
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateCourseBackground(String content, long courseId, long userId);
    /**
     * @Description:更新课程背景
     *  @date:@2016年12月14日下午4:50:13
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateCourseTarget(String content, long courseId, long userId);
    /**
     * @Description:更新课程设计原则
     *  @date:@2016年12月14日下午5:02:06
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateCourseDesignPrinciple(String content, long courseId, long userId);
    /**
     * @Description:
     *  @date:@2016年12月15日上午11:42:07
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateBaseInfo(CourseBaseInfoDto courseBaseInfoDto, long userId, long courseId);
    /**
     * @Description:更新课程模式
     *  @date:@2016年12月15日下午4:58:21
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void updateCourseModel(int courseModel, long courseId, long userId);
    /**
     * @Description:查询课程类型
     *  @date:@2016年12月30日上午11:35:08
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:Integer
     */
    Integer queryCourseTypeByCourseId(long courseId);
    
    public List<Object> getChapterLessonInfo(Jedis jedis, Set<String> chapterIds,
            Set<String> lessonIds, Set<String> lvIds, String[] chapterFields, String[] lessonFields,
            String[] lessonVideoFields);
   
    /**
     * 
     * @Description 返回  海外课程的所有课程
     * @author shisong
     * @date 2017年2月9日 上午8:51:58
     * @modifyNote 
     * @param courseIds
     * @param userId
     * @param type
     * @return
     */
    List<CourseDto> overseasCourseList(List<Long> courseIds);
    /**
     * @Description:同步主讲人的时候要更新缓存中节/小节的主讲人
     *  @date:@2017年2月22日上午8:46:41
     *  @author:嵇鹏
     *  @Param:
     *  @retuen:void
     */
    void syncCacheMainSpeaker(String speaker, long courseId, long userId);
   
}
